package com.shujia.scala

object Demo5Fun {

  def main(args: Array[String]): Unit = {

    /**
      * 函数   在任何位置都可以定义
      *
      * 参数 ：如果函数没有参数（）可以省略
      * 返回值：返回值类型可以不写   scala会自动推断返回值类型
      * 代码块最后一行作为返回值，可以省略return
      *
      * 面向对象编程   将对象传来传去  （有类型限制）
      * 面向函数编程   将函数传来传去
      *
      * 函数是有类型的---> 由参数类型和返回值类型决定的
      * def fun(str: String): String =  ---->  参数为String 返回值为String的一个函数
      *
      */


    def fun(str: String): String = {
      println("函数")

      if (str.equals("java")) {
        //return也可省略
        return "java"
      } else if (str.equals("scala")) {
        return "scala"
      } else {
        return "其他"
      }
    }

    //直接通过函数名调用函数
    println(fun("java"))

    //可变参数  参数类型是一个数组
    def fun2(name: String, age: Int*): Unit = {
      println(name)
      for (elem <- age) {
        println(elem)
      }
    }

    fun2("张三", 1, 2, 3, 4, 5)


    //函数参数默认值
    def fun3(name: String = "张三", age: Int): Unit = {
      println(name + "\t" + age)
    }

    //使用参数名赋值
    fun3(name = "李四", age = 12)

    //递归   计算10以内的阶乘


    def fun4(i: Int): Int = {

      if (i == 1) {
        return 1
      }

      i * fun4(i - 1)
    }

    println(fun4(10))

  }
}
